2024-01-08 Prometheus メトリック消失
何が起きたか
2024-01-08 21:00
~ 同 22:40 ごろ
~ 同 23:20 ごろ
メトリックが正常に取得できなくなる
~ 22:40 までのメトリックは全て取得できていない
22:40~23:20 においては Prometheus を収容している機器のメトリックのみが取得できている状態であった
前提
Grafana・Prometheus は共に VyOS のコンテナ機能を用いてデプロイされている それぞれが root を避けるため独自のユーザ・グループを持つ
マウントされたディレクトリもそのユーザ・グループからアクセスできる必要がある
Prometheus の他ノードからのスクレイピングのための接続には tailscale を用いている tailscale magic dns のホスト名を指定している
詳細
(要確認)VyOS は再起動した際にコンフィグディレクトリの未知のユーザ・グループを持つ所有権を書き換えているようだ VyOS がやっているのか、マウント時に何かが起きているのかは不明 これにより、Grafana や Prometheus のコンテナがディレクトリを読み書きできなくなり、起動に失敗した
この構成ではコンテナが用いる DNS として aardvark-dns が用いられる
aardvark-dns は起動時に /etc/resolv.conf を読み込むが、それ以降更新されても自動的に再読み込みをしない
また、tailscale は起動時に /etc/resolv.conf を書き換えて自身の持つ DNS server にリクエストを向けるようにする aardvark-dns が起動した後に tailscale が起動すると、書き換え前の /etc/resolv.conf を参照して DNS を処理するため、コンテナ内では tailscale magic dns の解決ができなくなる
これにより、Prometheus は他ノードのスクレイピングに失敗した
対策
監視
Grafana・Prometheus を Mackerel を使って外形監視するようにした これにより、起動に失敗している場合それを検出可能になる
Prometheus に status が UP でない target が存在する場合、アラートを発砲するようにした
Prometheus から exporter への接続の問題を検出可能になる
設定
ディレクトリ所有権が書き変わる問題
調査中だが、再起動はそこまで頻繁に行わないので込み入った対策は行わない
コンテナ内で tailscale の名前解決に失敗する問題
システムの name server を tailscale のもの(100.100.100.100)に設定した
これにより別の問題が発生する可能性もあるため様子を見ていきたい
search は VyOS から設定できないため、Prometheus から他ノードの exporter に接続する場合は tailnet のフル表記でノードを指定するようにした タイムライン
20:57 Grafana・Prometheus を収容している機器を再起動した
22:30 当機器の温度が異常であることに気付く
22:31 ごろ
Grafana の負荷が異常であることを確認
Grafana のログを確認
ディレクトリの権限の問題によりプラグインの取得に失敗し、再起動を繰り返している
Prometheus も再起動を繰り返していることを確認
Grafana のデータディレクトリの権限を修正
Prometheus についても同様に対応
22:40 ごろ
Grafana・Prometheus 共に正常に起動し、アクセスできることを確認
この時点では他ノードからのメトリックは取得できていなかったが、いずれ取得できるだろうと判断
22:50 ごろ
メトリックが取得できないため Prometheus のコンソールを確認
DNS の問題により接続に失敗している
実際にコンテナ内における DNS サーバにリクエストを送り、tailnet の名前解決に失敗していることを確認
23:00 ごろ
調査の結果、podman では aardvark-dns が使われていること、特定のサービスではない形(run-*.scope)で起動していることがわかった
aardvark-dns に SIGHUP シグナルを送り、設定を読ませたところ正常に動作するようになった
23:20 ごろ
他ノードからのメトリックが取得できていることを確認